package spring.module.scheduling;

import java.time.LocalTime;

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import lombok.extern.slf4j.Slf4j;

/**
 * @Scheduled 的常见用法，包括：固定速率执行、固定延迟执行、初始延迟执行、使用 Cron 表达式执行定时任务
 * 
 * @author Lucky Yang
 */
@Slf4j
@Component
public class ScheduledTasks {

    /**
     * fixedRate：固定速率执行。每2秒执行一次。如果执行时间大于2秒，侧任务完成后会立即执行
     */
    @Scheduled(fixedRate = 2000)
    public void fixedRateTask() {
        LocalTime start = LocalTime.now();
        int costTime = Nap.random(1000);
        log.info("Fixed Rate Task[{}][{}]", costTime, start);
    }

    /**
     * fixedDelay：固定延迟执行。距离上一次调用成功后2秒才执。
     */
    @Scheduled(fixedDelay  = 2000)
    public void fixedDelayTask() {
        LocalTime start = LocalTime.now();
        int costTime = Nap.random(1000);
        log.info("Fixed Delay Task[{}][{}]", costTime, start);
    }

    /**
     * initialDelay:初始延迟。任务的第一次执行将延迟2秒，然后将以3秒的固定间隔执行。
     */
    @Scheduled(initialDelay = 2000, fixedRate = 3000)
    public void initialDelayTask() {
        LocalTime start = LocalTime.now();
        int costTime = Nap.random(1000);
        log.info("Fixed Rate Task with Initial Delay[{}][{}]", costTime, start);
    }

    /**
     * cron：使用Cron表达式。　每分钟的1，2秒运行
     */
    @Scheduled(cron = "1-2 * * * * ? ")
    public void cronTask() {
        LocalTime start = LocalTime.now();
        int costTime = Nap.random(1000);
        log.info("Cron Expression[{}][{}]", costTime, start);
    }
}
